package com.monkeyboy.second.collections.copyonwrite;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 描述：演示CopyOnWriteArrayList可以在迭代的过程中修改数组内容，但是ArrayList不行，对比.
 * CopyOnWriteArrayList修改过程中是复制一份内存来进行修改，然后原来内存指针指向新的指针，这样就修改了
 */
public class CopyOnWriteArrayListDemo1 {

    public static void main(String[] args) {
//        ArrayList<String> list = new ArrayList<>();
       CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {
            System.out.println("list is" + list);
            String next = iterator.next();
            System.out.println(next);

            if (next.equals("2")) {
                //ArrayList，在这里删除后下一个迭代就会报异常，源码中next()方法中会进行modCount!=expectedModCount来比较修改的次数是否和原来的相等
                //modCount就是每次修改，新增等操作记录的次数，expectedModCount在新建迭代器的时候就把modCount的值赋予给它了，后面modCount的值改变了，所以
                //就会抛出异常
                list.remove("5");
            }
            if (next.equals("3")) {
                list.add("3 found");
            }
        }
    }
}
